package main

/**
** @ Author       : SmallSuperMan
** @ Date         : 2020-09-13 23:01:47
** @ LastEditTime : 2020-09-15 00:53:39
** @ LastEditors  : SmallSuperMan
** @ FilePath     : \GoProjectDirectory\mysqlTest\main.go
** @ Description  : 练习mysql操作
**/

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

// 定义一个全局对象db
var db *sql.DB

// PlayerInfo 运动员信息
type PlayerInfo struct {
	Number       uint   // 号码
	Name         string // 姓名
	HighestScore int    // 最高分
	Area         string // 分区
	TeamName     string // 队名
}

// 定义一个初始化数据库的函数
func initDB() (err error) {
	// Open打开一个dirverName指定的数据库，dataSourceName指定数据源
	dsn := "User:PassWord@(188.131.177.155:3306)/dyp?charset=utf8mb4&parseTime=True"
	// 不会校验账号密码是否正确
	db, err = sql.Open("mysql", dsn) // 注意！！！这里不要使用:=，给全局变量赋值，然后在main函数中使用全局变量db
	if err != nil {
		return err
	}
	// 尝试与数据库建立连接（校验dsn是否正确）
	err = db.Ping()
	if err != nil {
		return err
	}
	return nil
}

// 查询多条数据示例
func selecSQL() {
	//sqlStr := "select number,name,highest_score,area,team_name from player_infos"
	//rows, err := db.Query(sqlStr)
	sqlStr := "SELECT number,name,highest_score,area,team_name FROM player_infos WHERE highest_score > ?"
	rows, err := db.Query(sqlStr, 70)
	if err != nil {
		fmt.Printf("query failed, err:%v\n", err)
		return
	}
	// 非常重要：关闭rows释放持有的数据库链接
	defer rows.Close()

	// 循环读取结果集中的数据
	for rows.Next() {
		var player PlayerInfo
		err := rows.Scan(&player.Number, &player.Name, &player.HighestScore, &player.Area, &player.TeamName)
		if err != nil {
			fmt.Printf("scan failed, err:%v\n", err)
			return
		}
		fmt.Printf("%v\n", player)
	}
}

// 更新数据
func updateSQL(number int, teamName string) {
	sqlStr := "UPDATE player_infos set team_name=? where number =?"
	ret, err := db.Exec(sqlStr, teamName, number)
	if err != nil {
		fmt.Printf("更新语句执行失败, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("获取操作影响行数失败, err:%v\n", err)
		return
	}
	fmt.Printf("更新数据成功, 影响行数:%d\n", n)
}
func main() {
	err := initDB() // 调用初始化数据库的函数
	if err != nil {
		fmt.Printf("初始化数据库失败,err:%v\n", err)
		return
	}
	// 查询数据
	selecSQL()
	// 更新数据
	updateSQL(23, "骑士")
}
